package com.sse.product.rbac.service.impl;

import com.sse.product.rbac.entity.User;
import com.sse.product.model.rbac.LoginUser;
import com.sse.product.model.rbac.ResponseVo;
import com.sse.product.rbac.service.ILoginService;
import com.sse.product.util.JwtUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.Map;

/**
 * @author HP
 * @since 2024/6/18
 */

@Service
public class LoginServiceImpl implements ILoginService {

    @Autowired
    private AuthenticationManager authenticationManager;

    @Override
    public ResponseVo login(User user) {
        UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken =
                new UsernamePasswordAuthenticationToken(user.getUserName(), user.getPassword());
        Authentication authenticate = authenticationManager.authenticate(usernamePasswordAuthenticationToken);
        LoginUser loginUser = (LoginUser) authenticate.getPrincipal();
        String userId = loginUser.getUser().getId().toString();
        String jwt = JwtUtil.generateJwt(loginUser);

        // 返回给前端
        Map<String ,String> map =new HashMap();
        map.put("Authorization" ,jwt);
        ResponseVo<Map> responseVo = new ResponseVo<>();
        responseVo.setData(map);
        return responseVo;
    }

    @Override
    public ResponseVo logout() {
        //JWT本身是无状态的，服务端不会记录每个JWT的状态，因此服务端无法直接使JWT失效。JWT的有效性由其自身的过期时间来决定。
        //若要立即使JWT失效，可以使用一些黑名单策略：
        //Token Revocation List (TRL)：维护一个令牌撤销列表，将撤销的JWT加入列表中，服务端在验证JWT前先检查其是否在撤销列表中。
        //短期签发的JWT：使用较短的有效期来降低撤销要求。
        return new ResponseVo<>();
    }
}
